package com.jollychic.utils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射使用的工具类
 * 
 * @author zhangyong
 *
 */
public class ReflectUtils {

	/**
	 * 创建 对象
	 * @param cls
	 * @return
	 */
	public static <T> T getObj(Class<T> cls)  {
		try {
			return (T) cls.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("new instance has erro");
		}
	}
	
	/**
	 * 返回对象的中包含的属性
	 * @param cls
	 * @return
	 */
	public static <T> Field[] getFields(Class<T> cls) {
		return  cls.getDeclaredFields();
	}
	
	
	
	/**
	 * 提取指定的注解
	 * @param <E>
	 * @param cls
	 * @return
	 */
	public static  <E extends Annotation, T>  E getAnnotation(Class<T> cls, Class<E> an) {
		return  cls.getAnnotation(an);
	}
	
	/**
	 * 判断是否有指定的注解
	 * @param cls
	 * @param an
	 * @return
	 */
	public static  <E extends Annotation, T> boolean hasAnnotation(Class<T> cls, Class<E> an) {
		return cls.isAnnotationPresent(an);
	} 
	
	/**
	 * 获取执行的方法
	 * @param cls
	 * @param name
	 * @param parameterTypes
	 * @return
	 */
	public static  <T> Method getMethod (Class<T> cls,String name,  Class<?>... parameterTypes ) {
		try {
			return cls.getDeclaredMethod(name, parameterTypes);
		} catch (NoSuchMethodException | SecurityException e) {
			e.printStackTrace();
			throw new RuntimeException("No Such Method !");
		} 
	} 
	
	
}
